home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / programr / dpmi_lib.zip / DPMI_V1.C next >
C/C++ Source or Header  |  1991-11-05  |  3KB  |  120 lines

  1. /* This file is DPMI_V1.C
  2. **
  3. ** this program shows the GDT, IDT and LDT tables
  4. ** compile with smallmodel,protected mode instuctions
  5. ** link with dpmiutil.obj
  6. */
  7.  
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include "DPMI.H"
  11. #include <dos.h>
  12.  
  13. void protected_program()
  14. {
  15.     GDTR gdtr;               /* struct for sgdt,sidt call */
  16.     WORD sel,ldtsel,idtsel;
  17.     DWORD gdtbase,ldtbase,idtbase,handle;
  18.     WORD gdtlimit,ldtlimit,idtlimit;
  19.     unsigned i;
  20.     DESCRIPTOR far *gdt ;
  21.     GATE far *idt;
  22.  
  23.     sgdt(&gdtr) ;
  24.     printf("\nGDT : limit %04X address %04X%04X \n",
  25.             gdtr.limit,gdtr.hi,gdtr.lo);
  26.     printf("LDT selector= %X\n",(ldtsel=sldt()) );
  27.     printf("Task selector= %X\n",str());
  28.     printf("CS selector= %X   ",_CS );
  29.     printf("DS selector= %X\n",_DS );
  30.  
  31.     /* now we must alloced one selector and set the address
  32.     **    to the gdt address and limit */
  33.  
  34.     gdtbase=(DWORD)gdtr.hi<<16 | gdtr.lo ;
  35.     gdtlimit=gdtr.limit;
  36.  
  37.     if ((sel=AllocLDT(1))==0) {
  38.         printf("error allocldt\n") ;
  39.         return ;
  40.         }
  41.     if ((SetBaseAddress(sel,gdtbase))==-1) {
  42.         printf("err setbase\n");
  43.         return ;
  44.         }
  45.     if ((SetLimit(sel,gdtlimit))==-1) {
  46.         printf("err setlimit\n");
  47.         return ;
  48.         }
  49.  
  50.     /* the same procedure for the idt table */
  51.     sidt(&gdtr) ;
  52.     printf("IDT : limit %04X address %04X%04X \n",gdtr.limit,gdtr.hi,gdtr.lo);
  53.     idtbase=((DWORD)gdtr.hi <<16) | gdtr.lo ;
  54.     idtlimit=gdtr.limit;
  55.  
  56.     printf("GLOBALE DESCRIPTOR TABELLE:\n");
  57.     gdt=MK_FP(sel,0);       /* this is a protected mode pointer */
  58.     gdtlimit++;
  59.     gdtlimit/=8;            /* one descriptor = 8 bytes */
  60.  
  61.     for (i=0;i< gdtlimit ;i++) {
  62.         printf("g=%2X l=%2X ",i<<3,(i<<3)+5);
  63.         printdescriptor(gdt[i]);
  64.         if (ldtsel==i*8) {   /* to get the address of the ldt table */
  65.             ldtlimit=(DWORD)gdt[i].lim_hi;
  66.             ldtlimit &= 15;
  67.             ldtlimit<<=16;
  68.             ldtlimit|= gdt[i].lim_lo;
  69.             ldtbase=(DWORD)gdt[i].base_hi;
  70.             ldtbase<<=8;
  71.             ldtbase|=gdt[i].base_mi;
  72.             ldtbase<<=16;
  73.             ldtbase|=gdt[i].base_lo;
  74.             }
  75.         }
  76.     printf("ldtbase ldt=%lX  limit %lX\n",ldtbase,ldtlimit);
  77.     printf("gebrauchter selektor %X\n",sel);
  78.     if ((SetBaseAddress(sel,ldtbase))==-1) {printf("err setbase\n"); return ; } ;
  79.     if ((SetLimit(sel,ldtlimit))==-1) {printf("err setlimit\n"); return ; } ;
  80.  
  81.     printf("LOKALE DESCRIPTOR TABELLE:\n");
  82.     ldtlimit++;
  83.     ldtlimit/=8;
  84.     for (i=0;i< ldtlimit ;i++) {
  85.         printf("g=%2X l=%2X ",i<<3,(i<<3) +5);
  86.         printdescriptor(gdt[i]);
  87.         }
  88.  
  89.     printf("INTERRUPT DESCRIPTOR TABELLE:\n");
  90.     if ((SetBaseAddress(sel,idtbase))==-1) {
  91.         printf("err setbase\n");
  92.         return ;
  93.         }
  94.     if ((SetLimit(sel,idtlimit))==-1) {
  95.         printf("err setlimit\n");
  96.         return ;
  97.         }
  98.  
  99.     idt=MK_FP(sel,0);
  100.     idtlimit++;
  101.     idtlimit/=8;
  102.  
  103.     for (i=0;i<idtlimit;i++)
  104.         printf("sel %04X off %04X%04X count=%02X type=%02X dpl=%u\n",
  105.             idt[i].sel,idt[i].off_hi,idt[i].off_hi,
  106.             idt[i].count,idt[i].type&7,(idt[i].type&96)>>5);
  107.  
  108.     if ((FreeLDT(sel))==-1) {
  109.         printf("err freeldt\n");
  110.         return ;
  111.         }
  112. }
  113.  
  114. void main()
  115. {
  116.     real_to_protected();
  117.     protected_program();
  118.     protected_to_real();
  119. }
  120.